package com.github.cyf.poitl;

import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
import com.deepoove.poi.data.Documents;
import com.deepoove.poi.data.Paragraphs;
import com.deepoove.poi.policy.DocumentRenderPolicy;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author chenyifan
 * @create 2024-02-04 15:08
 */
public class PoiTlUtil {

    /**
     * 渲染数据并导出模板
     * @param template 模板文件
     * @param dataMap  数据
     * @param exportPath  导出路径
     */
    public static void renderAndExportTemplate(File template, Map dataMap, String exportPath) {
        // 渲染数据
        XWPFTemplate xwpfTemplate = XWPFTemplate.compile(template).render(dataMap);

        // 导出
        File file = new File(exportPath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        try {
            xwpfTemplate.writeToFile(exportPath);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 模板生成模板
     * 参考文档：https://deepoove.com/poi-tl/#_%E6%A8%A1%E6%9D%BF%E7%94%9F%E6%88%90%E6%A8%A1%E6%9D%BF
     * 比如我们把原先的一个文本标签分成多个表格标签，生成新的模板文件
     * @param initTemplate 初始模板文件
     * @param tagMap       key: 初始模板文件中的标签   value: 新的标签，可以是多个
     * @param exportPath   生成的模板导出路径
     */
    public static void buildTemplate(File initTemplate, Map<String, List<String>> tagMap, String exportPath) {
        Map<String, Object> dataMap = new HashMap<>();

        // 配置替换内容
        for (Map.Entry<String, List<String>> entry : tagMap.entrySet()) {
            List<String> valueList = entry.getValue();
            Documents.DocumentBuilder builder = Documents.of();
            for (String value : valueList) {
                builder.addParagraph(Paragraphs.of(value).create());
            }
            dataMap.put(entry.getKey(), builder.create());
        }

        // 绑定文档渲染策略
        ConfigureBuilder configBuilder = Configure.builder();
        for (String tagName : tagMap.keySet()) {
            configBuilder.bind(tagName, new DocumentRenderPolicy());
        }

        XWPFTemplate template = XWPFTemplate.compile(initTemplate, configBuilder.build()).render(dataMap);
        File file = new File(exportPath);
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        try {
            FileOutputStream os = new FileOutputStream(file);
            template.writeAndClose(os);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
